home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
標準ウィンドウ
/
SKELETON.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
12KB
|
324 lines
/******************************************************************************
* skeleton.c: 標準ウィンドウ
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*
* 機能説明:
* このプログラムは、SX-WINDOW の標準的なウィンドウを1つ開き、同時に動作
* してる他のアプリケーションに何ら影響を与えずに、ウィンドウのクローズボ
* タンが押されたら終了するという、必要最低限の処理を行います。
* これは、SX-WINDOW 用アプリケーションの骨格(基礎)となります。
*
* 使用方法: ウィンドウの移動や、アクティベート、クローズ処理を行う。
*/
#include <ctype.h>
#include <stdlib.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "skeleton.h" /* このプログラム固有のヘッダファイル */
char _sxkernelcomm[] = SXKERNEL; /* カーネル起動コマンド */
/******************************************************************************
* main(): メイン関数
******************************************************************************
*/
int main(void)
{
ComVal cv; /* 共通変数 */
if (!init(&cv)) { /* 初期化処理を行う */
showErrDialog(&cv); /* エラーダイアログを表示する */
cv.endFlag = TRUE; /* 終了フラグをセットする */
}
/* 終了フラグがセットされるまでループする */
while (!cv.endFlag) {
cv.errorCode = 0; /* エラーコードをクリアする */
/* タスクマンからイベントを取得する */
TSEventAvail(cv.eventMask, &cv.event);
/* 各イベントに対応した処理を行う */
switch (cv.event.ts.what) {
case E_MSLDOWN: /* マウスレフトダウンイベント */
msLDownEvent(&cv);
break;
case E_KEYDOWN: /* キーダウンイベント */
keyDownEvent(&cv);
break;
case E_UPDATE: /* アップデートイベント */
updateEvent(&cv);
break;
case E_ACTIVATE: /* アクティベートイベント */
activateEvent(&cv);
break;
case E_SYSTEM1: /* システムイベント */
case E_SYSTEM2:
systemEvent(&cv);
break;
}
if (cv.errorCode != 0) /* エラーが発生したか? */
showErrDialog(&cv); /* エラーダイアログを表示する */
}
/* 終了手続きを行う */
endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
return 0;
}
/******************************************************************************
* init(): 初期化処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 初期化成功
* = FALSE: 初期化失敗(終了)
* 注釈: 共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
* 表示などを行う。
*/
BOOLEAN init(ComVal *pcv)
{
pcv->windowPtr = NULL; /* ウィンドウポインタ */
pcv->activeFlag = FALSE; /* アクティブフラグ */
pcv->eventMask = EVENTMASK; /* イベントマスク */
pcv->errorCode = 0; /* エラーコード */
pcv->endFlag = FALSE; /* 終了フラグ */
TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する */
if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
pcv->errorCode = 1; /* バージョン2より古い */
return FALSE; /* 失敗したのでFALSEを返す */
}
if (!createWindow(pcv)) { /* ウィンドウを作成する */
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
GMForeColor(G_BLACK); /* フォアグラウンドカラーを黒にする */
/* バックグラウンドカラーをライトグレーにする */
GMBackColor(G_LGRAY);
WMShow(pcv->windowPtr); /* ウィンドウを表示する */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* createWindow(): ウィンドウの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗(終了)
*/
BOOLEAN createWindow(ComVal *pcv)
{
int paramFlags; /* パラメータの有無 */
Rect rc;
Task task; /* タスク管理レコード */
static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
paramFlags = TSTakeParam( /* コマンドラインを解析する */
task.command, /* コマンドライン */
&rc, /* 指定されたウィンドウ位置 */
NULL, /* 最終文字列を格納しない */
0, /* アドレステーブルを保存しない */
NULL, /* アドレステーブルを作成しない */
NULL); /* ポインタを確保しない */
if (!(paramFlags & 1)) { /* ウィンドウ位置の指定があるか? */
/* ない場合、システムからウィンドウの左上座標を取得する */
rc = winSize;
GMSlideRect(&rc, TSGetWindowPos());
}
pcv->windowPtr = WMOpen( /* ウィンドウをオープンする */
NULL, /* ウィンドウポインタを確保する */
&rc, /* ウィンドウの表示位置 */
WINTITLE, /* ウィンドウタイトル */
FALSE, /* オープン時に描画しない */
WI_STD2 << 4, /* タイトルの広い標準ウィンドウ */
W_FRONT, /* 一番手前に表示する */
TRUE, /* クローズボタンを使用する */
TSGetID()); /* 自分のタスクID */
if (pcv->windowPtr == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* msLDownEvent(): マウスレフトダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
* この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
*/
void msLDownEvent(ComVal *pcv)
{
int partCode; /* ウィンドウのパートコード */
Window *wTemp; /* テンポラリウィンドウポインタ */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
/* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
/* ウィンドウをアクティブにする */
WMSelect(pcv->windowPtr);
/* ボタンが押された場所のパートコードを取得する */
partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
/* タイトルバー以外か、左ボタンが離されたか? */
if (partCode != W_INDRAG || !EMLStill())
return;
}
/* マウスのボタンが押されている間、ウィンドウ上の各種処理を
システムに任せて、ボタンが押された、または離された場所の
パートコードを取得する */
partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
if (partCode == W_INCLOSE) /* クローズボタンか? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
}
}
/******************************************************************************
* keyDownEvent(): キーダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: OPT.1+'Q'キーでの終了処理を行う。
*/
void keyDownEvent(ComVal *pcv)
{
int shortCut; /* ショートカットキー */
if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか? */
/* キー入力した文字を大文字に変換する */
shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
if (shortCut == 'Q') /* 終了か? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
}
}
/******************************************************************************
* updateEvent(): アップデート処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* アップデート処理としてウィンドウ内部を描画する。
* この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
* イベントの処理ができなくなります。
*/
void updateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
WMUpdate(pcv->windowPtr); /* アップデートを開始する */
drawGraph(pcv); /* ウィンドウ内部を描画する */
WMUpdtOver(pcv->windowPtr); /* アップデートを終了する */
}
}
/******************************************************************************
* drawGraph(): ウィンドウ内部の描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawGraph(ComVal *pcv)
{
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
/* ここで、ウィンドウ内の各種描画を行う */
}
/******************************************************************************
* activateEvent(): アクティベートイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: アクティブ、インアクティブによるアクティブフラグの切り替えと、
* イベントマスクの切り替えを行う。
*/
void activateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
pcv->activeFlag = TRUE; /* アクティブフラグをセットする */
/* アクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK | EM_KEYDOWN;
/* イベントが他のウィンドウで、自分がアクティブ状態か? */
} else if (pcv->activeFlag) {
pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
/* インアクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK;
}
}
/******************************************************************************
* systemEvent(): システムイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: 全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
* 対応した処理を行う。
*/
void systemEvent(ComVal *pcv)
{
switch (pcv->event.ts.what2) { /* イベントの種類は? */
case CLOSEALL: /* 全ウィンドウのクローズ */
case ENDTSK: /* 全タスクの終了 */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
break;
case WINDOWSELECT: /* ウィンドウのセレクト */
WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
break;
}
}
/******************************************************************************
* showErrDialog(): エラーダイアログの表示
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void showErrDialog(ComVal *pcv)
{
int i;
static struct { /* エラー情報 */
int code; /* エラーコード */
int manager; /* 使用するマネージャ */
int flag; /* 表示フラッグ */
char *message; /* エラーメッセージ */
} errInfo[] = {
{ 1, 1, D_RED, "SX SYSTEMのバージョンが違います。" },
{ 2, 2, D_RED, "ウィンドウが作成できません。" },
{ 0, 1, D_YELLOW, "エラーが発生しました。" }
};
for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す */
if (errInfo[i].code == pcv->errorCode)
break;
switch (errInfo[i].manager) { /* マネージャの選択 */
case 1: /* ダイアログマン */
DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
case 2: /* タスクマン */
TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
}
}
/******************************************************************************
* endProc(): 終了手続き
******************************************************************************
* 引数: int code 終了コード
* ComVal *pcv 共通変数へのポインタ
* 注釈: ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
*/
void endProc(int code, ComVal *pcv)
{
/* ウィンドウポインタが確保されたままか? */
if (pcv->windowPtr != NULL)
WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する */
exit(code); /* プログラムを終了する */
}